package ln.javatest.day12.demo01;
/*
java.util.Collections是集合工具类，用来对集合进行操作。部分方法如下：
    public static <T> boolean addAll(Collection<T> c,T...elements):往集合中添加一些元素。
    public static void shuffle<list<?> list) :打乱集合顺序。
    public static <T> void sort(list<T> list):将集合中元素按照默认规则排序。（升序）
    public static <T> void sort(list<T> list，Comparator<? super T>):将集合中元素按照指定规则排序。
注意：
    Comparator和Comparable的区别:
        Comparable:自己this和别人参数比较，自己需要实现Comparable接口，重写比较的规则compareTo方法
        Comparator：相当于找一个第三方的裁判，比较两个

注意：
    sort方法使用前提：
    被排序的集合里边存储的元素，必须实现Comparable，重写接口中的方法compareTo
Comparable接口的排序规则：
    this-参数（升序）
    参数-this（降序）
*/

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Demo01Collections {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        //一次性往集合中添加多个元素，相当于多个add方法
        Collections.addAll(list,"b","a","c","e","f");
        System.out.println(list); //[b, a, c, e, f]
        Collections.shuffle(list);
        System.out.println(list); //[c, a, f, e, b]
        //sort方法值用在List（有序）集合中不用在Set集合（无序）中
        Collections.sort(list);
        System.out.println(list); //[a, b, c, e, f]
        ArrayList<Person2> p = new ArrayList<>();
        //Collections.addAll(Person2,"王嘉尔",10,"熊丰",20);
        p.add(new Person2("王嘉尔",20));
        p.add(new Person2("熊丰",20));
        //上面这种情况下，用sort进行排序，有两个参数没有指定根据哪个排序，所以需要重写compareTo方法
        Collections.sort(p);
        System.out.println(p); //[Person2{name='王嘉尔', age=20}, Person2{name='熊丰', age=20}]
        ArrayList<Integer> list1 = new ArrayList<>();
        //一次性往集合中添加多个元素，相当于多个add方法
        Collections.addAll(list1,1,5,9,3,6);
        System.out.println(list1);  //[1, 5, 9, 3, 6]
        Collections.sort(list1, new Comparator<Integer>() {
            //重写比较的规则
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2; //升序
            }
        });
        System.out.println(list1); //[1, 3, 5, 6, 9]
        ArrayList<Student> p1 = new ArrayList<>();
        p1.add(new Student("王",27));
        p1.add(new Student("熊",29));
        Collections.sort(p1, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                //按照年龄排序
                int result = o1.getAge() - o2.getAge();
                //如果两个人年龄相同，再使用姓名的第一个字比较
                if(result == 0){
                    result = o1.getName().charAt(0) - o2.getName().charAt(0);
                }
                return result;
            }
        });
        System.out.println(p1); //[Student{name='王', age=27}, Student{name='熊', age=29}]

    }
}
